﻿#include "classforipmaskcalculate.h"
#include "ui_classforipmaskcalculate.h"

#include <QString>



ClassForIPMaskCalculate::ClassForIPMaskCalculate(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClassForIPMaskCalculate)
{
    ui->setupUi(this);
    pObjIpMaskCal = new IPMaskCalculate;

    /*
     * 控件初始化
     * */
    ClassForIPMaskCalculate::funVoidControlInitialize();

    ui->linEdOfIPPrefix1_1->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
    ui->linEdOfIPAddr1_0->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
    ui->linEdOfIPAddr1_1->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
    ui->linEdOfIPAddr1_2->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
    ui->linEdOfIPAddr1_3->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));

    ClassForIPMaskCalculate::funVoidOfIpMaskCal();
}

ClassForIPMaskCalculate::~ClassForIPMaskCalculate()
{
    delete pObjIpMaskCal;  // 子网计算对象
    pObjIpMaskCal = nullptr;
    delete ui;
}

// 计算函数
void ClassForIPMaskCalculate::funVoidOfIpMaskCal()
{
    unsigned int varUIntPrefix = 24;  // 前缀长度

    std::array<unsigned int,4> varArrOfIp_InAddr = {0,0,0,0};  // 文本编辑框中的IP

    std::array<unsigned int,4> varArrOfMask = {0,0,0,0};  // 从MAP表中取得点分十进制的掩码

    unsigned int varUIntNetAddr1 = 255;  // 网络地址 第1位
    unsigned int varUIntNetAddr2 = 255;  // 网络地址 第2位
    unsigned int varUIntNetAddr3 = 255;  // 网络地址 第3位
    unsigned int varUIntNetAddr4 = 255;  // 网络地址 第4位

    unsigned int varUIntFirstAdd1 = 255;  // 起始IP 第1位
    unsigned int varUIntFirstAdd2 = 255;  // 起始IP 第2位
    unsigned int varUIntFirstAdd3 = 255;  // 起始IP 第3位
    unsigned int varUIntFirstAdd4 = 255;  // 起始IP 第4位

    unsigned int varUIntLastAdd1 = 255;  // 结束IP 第1位
    unsigned int varUIntLastAdd2 = 255;  // 结束IP 第2位
    unsigned int varUIntLastAdd3 = 255;  // 结束IP 第3位
    unsigned int varUIntLastAdd4 = 255;  // 结束IP 第4位

    unsigned int varUIntBroAdd1 = 255;  // 广播地址 第1位
    unsigned int varUIntBroAdd2 = 255;  // 广播地址 第2位
    unsigned int varUIntBroAdd3 = 255;  // 广播地址 第3位
    unsigned int varUIntBroAdd4 = 255;  // 广播地址 第4位

    QString varQStrMask1_Tmp = "";  // 点分十进制掩码 第1位
    QString varQStrMask2_Tmp = "";  // 点分十进制掩码 第1位
    QString varQStrMask3_Tmp = "";  // 点分十进制掩码 第1位
    QString varQStrMask4_Tmp = "";  // 点分十进制掩码 第1位

    QString varQStrNetAddr1_Tmp = "";  // 用于转换网络地址 第1位
    QString varQStrNetAddr2_Tmp = "";  // 用于转换网络地址 第2位
    QString varQStrNetAddr3_Tmp = "";  // 用于转换网络地址 第3位
    QString varQStrNetAddr4_Tmp = "";  // 用于转换网络地址 第4位

    QString varQStrFirsAddr1_Tmp = "";  // 用于转换起始IP 第1位
    QString varQStrFirsAddr2_Tmp = "";  // 用于转换起始IP 第2位
    QString varQStrFirsAddr3_Tmp = "";  // 用于转换起始IP 第3位
    QString varQStrFirsAddr4_Tmp = "";  // 用于转换起始IP 第4位

    QString varQStrLastAddr1_Tmp = "";  // 用于转换结束IP 第1位
    QString varQStrLastAddr2_Tmp = "";  // 用于转换结束IP 第2位
    QString varQStrLastAddr3_Tmp = "";  // 用于转换结束IP 第3位
    QString varQStrLastAddr4_Tmp = "";  // 用于转换结束IP 第4位

    QString varQStrBroAddr1_Tmp = "";  // 用于转换广播地址 第1位
    QString varQStrBroAddr2_Tmp = "";  // 用于转换广播地址 第2位
    QString varQStrBroAddr3_Tmp = "";  // 用于转换广播地址 第3位
    QString varQStrBroAddr4_Tmp = "";  // 用于转换广播地址 第4位



    /******** 下面是读取编辑控件的值 ********/

    // 读取输入的后缀长度，并转为 UInt 类型
    varUIntPrefix = ui->linEdOfIPPrefix1_1->text().toUInt();

    // 读取输入的 IP 地址，并转为 Array 类型
    varArrOfIp_InAddr[0] = ui->linEdOfIPAddr1_0->text().toUInt();
    varArrOfIp_InAddr[1] = ui->linEdOfIPAddr1_1->text().toUInt();
    varArrOfIp_InAddr[2] = ui->linEdOfIPAddr1_2->text().toUInt();
    varArrOfIp_InAddr[3] = ui->linEdOfIPAddr1_3->text().toUInt();

    // 获得点分十进制子网掩码
    varArrOfMask = pObjIpMaskCal->kaMapPrefixMask_IPv4.find(varUIntPrefix)->second;



    /******** 以下是给控件赋值 ********/

    // 点分十进制掩码
    varQStrMask1_Tmp = QString::number(varArrOfMask[0]);
    varQStrMask2_Tmp = QString::number(varArrOfMask[1]);
    varQStrMask3_Tmp = QString::number(varArrOfMask[2]);
    varQStrMask4_Tmp = QString::number(varArrOfMask[3]);
    ui->labOfMask1_0->setText(varQStrMask1_Tmp);
    ui->labOfMask1_1->setText(varQStrMask2_Tmp);
    ui->labOfMask1_2->setText(varQStrMask3_Tmp);
    ui->labOfMask1_3->setText(varQStrMask4_Tmp);

    // 网络地址
    varUIntNetAddr1 = pObjIpMaskCal->funArrayOfIpNetAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[0];
    varUIntNetAddr2 = pObjIpMaskCal->funArrayOfIpNetAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[1];
    varUIntNetAddr3 = pObjIpMaskCal->funArrayOfIpNetAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[2];
    varUIntNetAddr4 = pObjIpMaskCal->funArrayOfIpNetAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[3];
    varQStrNetAddr1_Tmp = QString::number(varUIntNetAddr1);
    varQStrNetAddr2_Tmp = QString::number(varUIntNetAddr2);
    varQStrNetAddr3_Tmp = QString::number(varUIntNetAddr3);
    varQStrNetAddr4_Tmp = QString::number(varUIntNetAddr4);
    ui->labOfNetAdd1_0->setText(varQStrNetAddr1_Tmp);
    ui->labOfNetAdd1_1->setText(varQStrNetAddr2_Tmp);
    ui->labOfNetAdd1_2->setText(varQStrNetAddr3_Tmp);
    ui->labOfNetAdd1_3->setText(varQStrNetAddr4_Tmp);

    // 起始IP
    varUIntFirstAdd1 = pObjIpMaskCal->funArrayOfFirstAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[0];
    varUIntFirstAdd2 = pObjIpMaskCal->funArrayOfFirstAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[1];
    varUIntFirstAdd3 = pObjIpMaskCal->funArrayOfFirstAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[2];
    varUIntFirstAdd4 = pObjIpMaskCal->funArrayOfFirstAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[3];
    varQStrFirsAddr1_Tmp = QString::number(varUIntFirstAdd1);
    varQStrFirsAddr2_Tmp = QString::number(varUIntFirstAdd2);
    varQStrFirsAddr3_Tmp = QString::number(varUIntFirstAdd3);
    varQStrFirsAddr4_Tmp = QString::number(varUIntFirstAdd4);
    ui->labOfFirstAdd1_0->setText(varQStrFirsAddr1_Tmp);
    ui->labOfFirstAdd1_1->setText(varQStrFirsAddr2_Tmp);
    ui->labOfFirstAdd1_2->setText(varQStrFirsAddr3_Tmp);
    ui->labOfFirstAdd1_3->setText(varQStrFirsAddr4_Tmp);

    // 结束IP
    varUIntLastAdd1 = pObjIpMaskCal->funArrayOfLastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[0];
    varUIntLastAdd2 = pObjIpMaskCal->funArrayOfLastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[1];
    varUIntLastAdd3 = pObjIpMaskCal->funArrayOfLastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[2];
    varUIntLastAdd4 = pObjIpMaskCal->funArrayOfLastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[3];
    varQStrLastAddr1_Tmp = QString::number(varUIntLastAdd1);
    varQStrLastAddr2_Tmp = QString::number(varUIntLastAdd2);
    varQStrLastAddr3_Tmp = QString::number(varUIntLastAdd3);
    varQStrLastAddr4_Tmp = QString::number(varUIntLastAdd4);
    ui->labOfLastAdd1_0->setText(varQStrLastAddr1_Tmp);
    ui->labOfLastAdd1_1->setText(varQStrLastAddr2_Tmp);
    ui->labOfLastAdd1_2->setText(varQStrLastAddr3_Tmp);
    ui->labOfLastAdd1_3->setText(varQStrLastAddr4_Tmp);


    // 广播地址
    varUIntBroAdd1 = pObjIpMaskCal->funArrayOfBroadcastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[0];
    varUIntBroAdd2 = pObjIpMaskCal->funArrayOfBroadcastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[1];
    varUIntBroAdd3 = pObjIpMaskCal->funArrayOfBroadcastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[2];
    varUIntBroAdd4 = pObjIpMaskCal->funArrayOfBroadcastAddr_IPv4(varUIntPrefix,varArrOfIp_InAddr)[3];
    varQStrBroAddr1_Tmp = QString::number(varUIntBroAdd1);
    varQStrBroAddr2_Tmp = QString::number(varUIntBroAdd2);
    varQStrBroAddr3_Tmp = QString::number(varUIntBroAdd3);
    varQStrBroAddr4_Tmp = QString::number(varUIntBroAdd4);
    ui->labOfBroAdd1_0->setText(varQStrBroAddr1_Tmp);
    ui->labOfBroAdd1_1->setText(varQStrBroAddr2_Tmp);
    ui->labOfBroAdd1_2->setText(varQStrBroAddr3_Tmp);
    ui->labOfBroAdd1_3->setText(varQStrBroAddr4_Tmp);
}

// 判断前缀输入合规性
bool ClassForIPMaskCalculate::funBoolOfPrefixLegal(const QString &str) const
{
    // 返回值
    bool varBoolLegal = false;

    unsigned int varLenth = 0;
    varLenth = str.toUInt();

    if(varLenth<0 || varLenth>33){
        ui->pusButIPMask1_1->setEnabled(false);
        return varBoolLegal;
    }else{
        ui->pusButIPMask1_1->setEnabled(true);
        varBoolLegal = true;
        return varBoolLegal;
    }

    return varBoolLegal;
}

// 判断IP地址合规性
bool ClassForIPMaskCalculate::funBoolOfIPLegal(const QString &str) const
{
    // 返回值
    bool varBoolLegal = false;

    unsigned int varLenth = 0;
    varLenth = str.toUInt();

    if(varLenth<0 || varLenth>255){
        ui->pusButIPMask1_1->setEnabled(false);
        return varBoolLegal;
    }else{
        ui->pusButIPMask1_1->setEnabled(true);
        varBoolLegal = true;
        return varBoolLegal;
    }

    return varBoolLegal;
}

// 控件初始化函数
void ClassForIPMaskCalculate::funVoidControlInitialize()
{
    ui->tableWidPrefix1_1->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableWidPrefix1_1->verticalHeader()->setHidden(true); // 隐藏标题
    //ui->tableWidPrefix1_1->;
    ui->tableWidPrefix1_1->setColumnWidth(0,80);
    ui->tableWidPrefix1_1->setColumnWidth(1,150);
    //ui->tableWidPrefix1_1->takeVerticalHeaderItem(1);

    // 设置 前缀 单元格剧中
    for(int i = 0;i<31;i++){
        ui->tableWidPrefix1_1->item(i,0)->setTextAlignment(Qt::AlignCenter);
    }

    ui->tabWidget1->removeTab(1);

}

// 清除/初始标签内容
void ClassForIPMaskCalculate::funVoidClear()
{
    ui->linEdOfIPPrefix1_1->setText("");
    ui->linEdOfIPAddr1_0->setText("");
    ui->linEdOfIPAddr1_1->setText("");
    ui->linEdOfIPAddr1_2->setText("");
    ui->linEdOfIPAddr1_3->setText("");

    ui->labOfMask1_0->setText("");
    ui->labOfMask1_1->setText("");
    ui->labOfMask1_2->setText("");
    ui->labOfMask1_3->setText("");

    ui->labOfNetAdd1_0->setText("");
    ui->labOfNetAdd1_1->setText("");
    ui->labOfNetAdd1_2->setText("");
    ui->labOfNetAdd1_3->setText("");

    ui->labOfFirstAdd1_0->setText("");
    ui->labOfFirstAdd1_1->setText("");
    ui->labOfFirstAdd1_2->setText("");
    ui->labOfFirstAdd1_3->setText("");

    ui->labOfLastAdd1_0->setText("");
    ui->labOfLastAdd1_1->setText("");
    ui->labOfLastAdd1_2->setText("");
    ui->labOfLastAdd1_3->setText("");

    ui->labOfBroAdd1_0->setText("");
    ui->labOfBroAdd1_1->setText("");
    ui->labOfBroAdd1_2->setText("");
    ui->labOfBroAdd1_3->setText("");
}

// 计算按钮按下事件激发的合规判断
void ClassForIPMaskCalculate::on_pusButIPMask1_1_pressed()
{
    if(ui->linEdOfIPPrefix1_1->text().isEmpty()){
        ui->linEdOfIPPrefix1_1->setStyleSheet("#linEdOfIPPrefix1_1 {background-color:#cc7a7a}");
    }
    if(ui->linEdOfIPAddr1_0->text().isEmpty()){
        ui->linEdOfIPAddr1_0->setStyleSheet("#linEdOfIPAddr1_0 {background-color:#cc7a7a}");
    }
    if(ui->linEdOfIPAddr1_1->text().isEmpty()){
        ui->linEdOfIPAddr1_1->setStyleSheet("#linEdOfIPAddr1_1 {background-color:#cc7a7a}");
    }
    if(ui->linEdOfIPAddr1_2->text().isEmpty()){
        ui->linEdOfIPAddr1_2->setStyleSheet("#linEdOfIPAddr1_2 {background-color:#cc7a7a}");
    }
    if(ui->linEdOfIPAddr1_3->text().isEmpty()){
        ui->linEdOfIPAddr1_3->setStyleSheet("#linEdOfIPAddr1_3 {background-color:#cc7a7a}");
    }
}

// 前缀编辑事件
void ClassForIPMaskCalculate::on_linEdOfIPPrefix1_1_textEdited(const QString &arg1)
{
    if(ClassForIPMaskCalculate::funBoolOfPrefixLegal(arg1)){
        ui->linEdOfIPPrefix1_1->setStyleSheet("#linEdOfIPPrefix1_1 {background-color:#ffffff}");
    }else{
        ui->linEdOfIPPrefix1_1->setStyleSheet("#linEdOfIPPrefix1_1 {background-color:#cc7a7a}");
    }
}

// IP地址输入框编辑事件 第1位
void ClassForIPMaskCalculate::on_linEdOfIPAddr1_0_textEdited(const QString &arg1)
{
    if(ClassForIPMaskCalculate::funBoolOfIPLegal(arg1)){
        ui->linEdOfIPAddr1_0->setStyleSheet("#linEdOfIPAddr1_0 {background-color:#ffffff}");
    }else{
        ui->linEdOfIPAddr1_0->setStyleSheet("#linEdOfIPAddr1_0 {background-color:#cc7a7a}");
    }
}

// IP地址输入框编辑事件 第2位
void ClassForIPMaskCalculate::on_linEdOfIPAddr1_1_textEdited(const QString &arg1)
{
    if(ClassForIPMaskCalculate::funBoolOfIPLegal(arg1)){
        ui->linEdOfIPAddr1_1->setStyleSheet("#linEdOfIPAddr1_1 {background-color:#ffffff}");
    }else{
        ui->linEdOfIPAddr1_1->setStyleSheet("#linEdOfIPAddr1_1 {background-color:#cc7a7a}");
    }
}

// IP地址输入框编辑事件 第3位
void ClassForIPMaskCalculate::on_linEdOfIPAddr1_2_textEdited(const QString &arg1)
{
    if(ClassForIPMaskCalculate::funBoolOfIPLegal(arg1)){
        ui->linEdOfIPAddr1_2->setStyleSheet("#linEdOfIPAddr1_2 {background-color:#ffffff}");
    }else{
        ui->linEdOfIPAddr1_2->setStyleSheet("#linEdOfIPAddr1_2 {background-color:#cc7a7a}");
    }
}

// IP地址输入框编辑事件 第4位
void ClassForIPMaskCalculate::on_linEdOfIPAddr1_3_textEdited(const QString &arg1)
{
    if(ClassForIPMaskCalculate::funBoolOfIPLegal(arg1)){
        ui->linEdOfIPAddr1_3->setStyleSheet("#linEdOfIPAddr1_3 {background-color:#ffffff}");
    }else{
        ui->linEdOfIPAddr1_3->setStyleSheet("#linEdOfIPAddr1_3 {background-color:#cc7a7a}");
    }
}

// 清空按钮的单击事件
void ClassForIPMaskCalculate::on_pusButClear_clicked()
{
    ClassForIPMaskCalculate::funVoidClear();
}

// 计算按钮 的抬起 事件
void ClassForIPMaskCalculate::on_pusButIPMask1_1_released()
{
    ui->linEdOfIPPrefix1_1->setStyleSheet("#linEdOfIPPrefix1_1 {background-color:#ffffff}");
    ui->linEdOfIPAddr1_0->setStyleSheet("#linEdOfIPAddr1_0 {background-color:#ffffff}");
    ui->linEdOfIPAddr1_1->setStyleSheet("#linEdOfIPAddr1_1 {background-color:#ffffff}");
    ui->linEdOfIPAddr1_2->setStyleSheet("#linEdOfIPAddr1_2 {background-color:#ffffff}");
    ui->linEdOfIPAddr1_3->setStyleSheet("#linEdOfIPAddr1_3 {background-color:#ffffff}");

    if(ui->linEdOfIPPrefix1_1->text().isEmpty() || ui->linEdOfIPAddr1_0->text().isEmpty() ||
            ui->linEdOfIPAddr1_1->text().isEmpty() || ui->linEdOfIPAddr1_2->text().isEmpty() || ui->linEdOfIPAddr1_3->text().isEmpty()){
        return;
    }

    ClassForIPMaskCalculate::funVoidOfIpMaskCal();
}

